fsck: Check for refs missing corresponding commit
authorColin Walters <walters@verbum.org>
Mon, 8 May 2017 20:59:14 +0000 (16:59 -0400)
committerAtomic Bot <atomic-devel@projectatomic.io>
Tue, 9 May 2017 14:05:46 +0000 (14:05 +0000)
Just doing this one quickly since it was easy.

Closes: https://github.com/ostreedev/ostree/issues/831
Closes: #841
Approved by: jlebon

src/ostree/ot-builtin-fsck.c
tests/test-corruption.sh

index 2f154cffeca8341c2166bb84a31bd289f7496285..7519d6dbfc12b5348bfef956334ff6383c601402 100644 (file)
@@ -246,6 +246,7 @@ ostree_builtin_fsck (int argc, char **argv, GCancellable *cancellable, GError **
   gpointer key, value;
   gboolean found_corruption = FALSE;
   guint n_partial = 0;
+  g_autoptr(GHashTable) all_refs = NULL;
   g_autoptr(GHashTable) objects = NULL;
   g_autoptr(GHashTable) commits = NULL;
   g_autoptr(GPtrArray) tombstones = NULL;
@@ -254,6 +255,27 @@ ostree_builtin_fsck (int argc, char **argv, GCancellable *cancellable, GError **
   if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error))
     goto out;
 
+  if (!opt_quiet)
+    g_print ("Validating refs...\n");
+
+  /* Validate that the commit for each ref is available */
+  if (!ostree_repo_list_refs (repo, NULL, &all_refs,
+                              cancellable, error))
+    return FALSE;
+  g_hash_table_iter_init (&hash_iter, all_refs);
+  while (g_hash_table_iter_next (&hash_iter, &key, &value))
+    {
+      const char *refname = key;
+      const char *checksum = value;
+      g_autoptr(GVariant) commit = NULL;
+      if (!ostree_repo_load_variant (repo, OSTREE_OBJECT_TYPE_COMMIT,
+                                     checksum, &commit, error))
+        {
+          g_prefix_error (error, "Loading commit for ref %s: ", refname);
+          goto out;
+        }
+    }
+
   if (!opt_quiet)
     g_print ("Enumerating objects...\n");
 
index ef0e94ef1c8274f8afbf8de771af0cf257b0b50b..8e2aba56278ba133655c6343e65ebe2a8f0d94b0 100755 (executable)
 
 set -euo pipefail
 
-echo "1..2"
+echo "1..3"
 
 . $(dirname $0)/libtest.sh
 
+cd ${test_tmpdir}
+rm repo files -rf
 setup_test_repository "bare"
 $OSTREE checkout test2 checkout-test2
 cd checkout-test2
@@ -34,6 +36,8 @@ $OSTREE fsck -q
 echo "ok chmod"
 
 cd ${test_tmpdir}
+rm repo files -rf
+setup_test_repository "bare"
 rm checkout-test2 -rf
 $OSTREE checkout test2 checkout-test2
 cd checkout-test2
@@ -41,3 +45,14 @@ chmod o+x firstfile
 $OSTREE fsck -q --delete && (echo 1>&2 "fsck unexpectedly succeeded"; exit 1)
 
 echo "ok chmod"
+
+cd ${test_tmpdir}
+rm repo files -rf
+setup_test_repository "bare"
+find repo/ -name '*.commit' -delete
+if $OSTREE fsck -q 2>err.txt; then
+    assert_not_reached "fsck unexpectedly succeeded"
+fi
+assert_file_has_content_literal err.txt "Loading commit for ref test2: No such metadata object"
+
+echo "ok missing commit"